#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void task1() {
    printf("task1 is running...\n");
}

void task2() {
    printf("task2 is runnning...\n");
}

int main() {
    int id = fork();
    if(id == -1) {
        printf("fork error\n");
        exit(-1);
    } else if(id == 0) {  //子进程
        int cnt = 5;
        while(cnt--) {
            printf("子进程, pid:%d, ppid:%d, cnt:%d\n", getpid(), getppid(), cnt);
            sleep(1);
        }
        exit(1);
    } else {  //父进程
        int status = 0;
        while(1) {  //轮询
            pid_t ret = waitpid(id, &status, WNOHANG);  //非阻塞式等待
            if(ret == -1) {
                printf("wait fail\n");  //调用失败
                exit(1);
            } else if(ret == 0){  //调用成功，但子进程未退出
                printf("wait success, but child process not exit\n");
                task1();  //执行其他命令
                task2();
            } else {  //调用成功，子进程退出
                printf("wait success, and child exited\n");
                break;
            }
            sleep(1);
        }

        if(WIFEXITED(status)) {  //正常退出
            printf("exit code:%d\n", WEXITSTATUS(status));
        } else {  //异常终止
            printf("exit signal:%d\n",(status & 0x7f));
        }
        
    }
    return 0;
}


// #include <stdio.h>
// #include <stdlib.h>
// #include <sys/types.h>
// #include <sys/wait.h>
// #include <unistd.h>

//int main() {
//    int id = fork();
//    if(id == -1) {
//        printf("fork error\n");
//        exit(-1);
//    } else if(id == 0) {  //子进程
//        int cnt = 5;
//        while(cnt--) {
//            printf("子进程, pid:%d, ppid:%d, cnt:%d\n", getpid(), getppid(), cnt);
//            sleep(1);
//        }
//        exit(1);
//    } else {  //父进程
//        sleep(10);
//        int status = 0;
//        pid_t ret = waitpid(id, &status, 0);  //阻塞等待
//        if(ret == -1) {
//            printf("wait fail\n");
//            exit(1);
//        } else {
//            printf("wait success\n");
//        }
//        printf("exit signal:%d,  exit code:%d\n", (status & 0x7f), (status >> 8 & 0xff));
//    }
//    return 0;
//}
//
//

//#include <stdio.h>
//#include <stdlib.h>
//#include <sys/types.h>
//#include <sys/wait.h>
//#include <unistd.h>
//
//int main() {
//    int id = fork();
//    if(id == -1) {
//        printf("fork error\n");
//        exit(-1);
//    } else if(id == 0) {  //子进程
//        int cnt = 5;
//        while(cnt--) {
//            printf("子进程, pid:%d, ppid:%d, cnt:%d\n", getpid(), getppid(), cnt);
//            sleep(1);
//        }
//        exit(1);
//    } else {  //父进程
//        sleep(10);
//        int status = 0;
//        pid_t ret = wait(&status);
//        if(ret == -1) {
//            printf("wait fail\n");
//            exit(1);
//        } else {
//            printf("wait success\n");
//            //printf("exit code:%d\n", WEXITSTATUS(status));
//        }
//        printf("status code:%d\n", status);
//    }
//    return 0;
//}
//
//
//

//#include <stdio.h>
//#include <stdlib.h>
//#include <unistd.h>
//#include <sys/wait.h>
//#include <sys/types.h>
//int main()
//{
//	pid_t id = fork();
//	if(id == 0){
//		//child
//		int count = 10;
//		while(count--){
//			printf("I am child...PID:%d, PPID:%d\n", getpid(), getppid());
//			sleep(1);
//		}
//		exit(0);
//	}
//	//father
//	int status = 0;
//	pid_t ret = wait(&status);
//	if(ret > 0){
//		//wait success
//		printf("wait child success...\n");
//		if(WIFEXITED(status)){
//			//exit normal
//			printf("exit code:%d\n", WEXITSTATUS(status));
//		}
//	}
//	sleep(3);
//	return 0;
//}
//
